; void gris_epsilon_inf_c(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)
; r -i asm -g i ../data/base/edificio.jpg
global gris_epsilon_inf_asm

%define imagenSrc [ebp + 8]
%define imagenDst [ebp + 12]
%define h [ebp + 16]
%define w [ebp + 20]
%define rowSizeSrc [ebp + 24]
%define rowSizeDst [ebp + 28]


section .text

gris_epsilon_inf_asm:

; armo el stack
push ebp 
mov ebp, esp
push esi
push edi
push ebx

;***********************************************************
;CARGO DATOS
;***********************************************************
;cargo altura y ancho de la matriz
mov ecx , h
mov ebx , w

; Cargo los punteros de la imagen
mov esi , imagenSrc
mov edi , imagenDst
mov edx, imagenSrc
mov eax, imagenDst


;***********************************************************
;***********   COMIENZA CICLO  *****************************
; ESI = PUNTERO IMAGEN SRC
; EDI = PUNTERO IMAGEN DST

; EBX = ANCHO
; ECX = ALTURA
; EDX = PUNTERO IMAGEN SRC
; EAX = PUNTERO IMAGEN DST
;***********************************************************


cicloInfY:

mov ebx , w


jmp cicloInfX

acomodar_fila_incompleta:


mov ebx , w
mov esi, edx
add esi, ebx
add esi, ebx
add esi, ebx

mov edi, eax
add edi, ebx

sub esi, 18
sub edi, 6

xor ebx,ebx
mov ebx, 6

cicloInfX:
pxor xmm4,xmm4
movd xmm4, eax

pxor xmm5,xmm5
movd xmm5, edx


movdqu xmm0, [esi]            ; B
movdqu xmm1 , [esi + 1]       ; G
movdqu xmm2 , [esi + 2]       ; R

pmaxub xmm2,xmm1
pmaxub xmm0,xmm2

xor eax,eax
xor edx,edx

movd eax, xmm0
and eax, 0x000000ff
mov edx,eax

PSRLDQ xmm0, 3
movd eax, xmm0
and eax, 0x000000ff
shl eax, 8
and edx, 0xffff00ff
or edx,eax


PSRLDQ xmm0, 3
movd eax, xmm0
and eax, 0x000000ff
shl eax, 16
and edx, 0xff00ffff
or edx,eax

PSRLDQ xmm0, 3
movd eax, xmm0
and eax, 0x000000ff
shl eax, 24
and edx, 0x00ffffff
or edx,eax

;muevo 4 pixels
mov [edi] , edx
add edi, 4
xor edx,edx

PSRLDQ xmm0, 3
movd eax, xmm0
and eax, 0x000000ff
mov edx, eax

PSRLDQ xmm0, 3
movd eax, xmm0
and eax, 0x000000ff
shl eax, 8
and edx, 0xffff00ff
or edx,eax

mov [edi] , dx
add edi, 2

add esi , 18 ; Avanzo los puteros
sub ebx , 6


movd eax, xmm4
movd edx, xmm5

cmp ebx, 0
jz saltoBasura

; veo si me quedan 18 por leer sino ajusto para poder leerlo correctamente
cmp ebx, 7
jl acomodar_fila_incompleta

jmp cicloInfX

saltoBasura:

;calculo para saltear la basura de la imagen y empezar en la prox fila
add edx, rowSizeSrc
add eax, rowSizeDst

; Apunto los punteros a la siguiente fila
mov esi, edx
mov edi, eax

;loop
dec ecx
cmp ecx,0
jnz cicloInfY

fin_gris_inf:
pop ebx
pop edi
pop esi
pop ebp

ret
